#include <gtest/gtest.h>
#include <stack>
#include <expr.h>

// 测试后缀表达式求值函数
TEST(PostfixEvaluationTest, EvaluateSimpleExpression) {
    // 测试基本的后缀表达式
    EXPECT_EQ(evaluatePostfix("3 4 +"), 7);    // 3 + 4 = 7
    EXPECT_EQ(evaluatePostfix("10 2 8 * + 3 -"), 23);  // 10 + (2 * 8) - 3 = 23
    EXPECT_EQ(evaluatePostfix("2 3 4 * +"), 14);  // 2 + (3 * 4) = 14
}

TEST(PostfixEvaluationTest, EvaluateComplexExpression) {
    // 测试包含除法的复杂表达式
    EXPECT_EQ(evaluatePostfix("3 4 + 2 * 7 /"), 2);  // (3 + 4) * 2 / 7 = 2
    EXPECT_EQ(evaluatePostfix("5 1 2 + 4 * + 3 -"), 14);  // 5 + (1 + 2) * 4 - 3 = 14
}

TEST(PostfixEvaluationTest, EvaluateSingleNumber) {
    // 测试单个数字的后缀表达式
    EXPECT_EQ(evaluatePostfix("42"), 42);  // 单一数字 42
}

TEST(PostfixEvaluationTest, EvaluateWithZero) {
    // 测试包含零的表达式
    EXPECT_EQ(evaluatePostfix("0 5 +"), 5);  // 0 + 5 = 5
    EXPECT_EQ(evaluatePostfix("5 0 -"), 5);  // 5 - 0 = 5
}

TEST(PostfixEvaluationTest, EvaluateWithNegativeNumbers) {
    // 测试包含负数的表达式
    EXPECT_EQ(evaluatePostfix("-3 4 +"), 1);   // -3 + 4 = 1
    EXPECT_EQ(evaluatePostfix("5 -2 *"), -10); // 5 * -2 = -10
}

// 测试中缀表达式转后缀表达式函数
TEST(InfixToPostfixTest, SimpleExpression) {
    // 简单的中缀转后缀测试
    EXPECT_EQ(infixToPostfix("3+4"), "34+");
    EXPECT_EQ(infixToPostfix("3*4+5"), "34*5+");
}

TEST(InfixToPostfixTest, ComplexExpression) {
    // 复杂的中缀表达式转后缀表达式测试
    EXPECT_EQ(infixToPostfix("(3+4)*2/7"), "34+2*7/");
    EXPECT_EQ(infixToPostfix("5+(1+2)*4-3"), "512+4*+3-");
    EXPECT_EQ(infixToPostfix("3*(4+5)-6/2"), "345+*62/-");
}

TEST(InfixToPostfixTest, HandlingParentheses) {
    // 测试括号的处理
    EXPECT_EQ(infixToPostfix("3+(4*5)"), "345*+");
    EXPECT_EQ(infixToPostfix("(3+4)*(2+7)"), "34+27+*");
}

TEST(InfixToPostfixTest, HandlingMultipleOperators) {
    // 测试多个运算符
    EXPECT_EQ(infixToPostfix("3+4*2/(1-5)"), "342*15-/+");
    EXPECT_EQ(infixToPostfix("5+(1+2)*4-3"), "512+4*+3-");
    EXPECT_EQ(infixToPostfix("3*(4+5)-6/2"), "345+*62/-");
    EXPECT_EQ(infixToPostfix("3+4*5-6/2"), "345*+62/-");
}

TEST(InfixToPostfixTest, SingleDigitInput) {
    // 测试单个数字
    EXPECT_EQ(infixToPostfix("3"), "3");
    EXPECT_EQ(infixToPostfix("42"), "42");
}

// 测试无效输入
TEST(PostfixEvaluationTest, InvalidExpression) {
    // 测试无效的后缀表达式
    EXPECT_THROW(evaluatePostfix("3 4 + +"), std::exception); // 语法错误
    EXPECT_THROW(evaluatePostfix("3 + 4"), std::exception);  // 非后缀表达式
}

TEST(InfixToPostfixTest, InvalidExpression) {
    // 测试无效的中缀表达式
    EXPECT_THROW(infixToPostfix("3++4"), std::exception); // 非法连续运算符
    EXPECT_THROW(infixToPostfix("(3+4"), std::exception);  // 括号不匹配
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
